feat(quart): Add span streaming support to Quart integration - #6502
Conversation
Move http.query and client.address attribute collection inside the should_send_default_pii() check so sensitive values are not captured by default. Fixes PY-2514 Fixes #6499
Add span streaming support for the Quart integration when the trace_lifecycle stream experiment is enabled. Sets HTTP request attributes (method, headers, URL, query, client IP) on the segment span and uses the correct source constant from sentry_sdk.traces for span-first mode. Depends on #6501 being merged first. Fixes PY-2352 Fixes #6050
Codecov Results 📊✅ 90550 passed | ⏭️ 6031 skipped | Total: 96581 | Pass Rate: 93.76% | Execution Time: 322m 24s 📊 Comparison with Base Branch
All tests are passing successfully. ✅ Patch coverage is 91.84%. Project has 2418 uncovered lines. Files with missing lines (1)
Coverage diff@@ Coverage Diff @@
## main #PR +/-##
==========================================
+ Coverage 89.74% 89.75% +0.01%
==========================================
Files 192 192 —
Lines 23548 23583 +35
Branches 8094 8116 +22
==========================================
+ Hits 21132 21165 +33
- Misses 2416 2418 +2
- Partials 1330 1334 +4Generated by Codecov Action |
There was a problem hiding this comment.
We'll need a streaming counterpart for this piece of code, something like:
client = sentry_sdk.get_client()
if has_span_streaming_enabled(client.options):
span = get_current_span()
if span is not None:
span._segment._update_active_thread()| SENTRY_PYTHON_TEST_POSTGRES_USER: postgres | ||
| SENTRY_PYTHON_TEST_POSTGRES_PASSWORD: sentry | ||
| SENTRY_PYTHON_TEST_MYSQL_USER: root | ||
| SENTRY_PYTHON_TEST_MYSQL_PASSWORD: sentry |
There was a problem hiding this comment.
Missing MySQL host env variable
Medium Severity
The DB CI job sets SENTRY_PYTHON_TEST_POSTGRES_HOST to postgres for Python 3.6/3.7 container runs but does not set SENTRY_PYTHON_TEST_MYSQL_HOST the same way for the new MySQL service. tests/integrations/aiomysql reads that variable and defaults to localhost, which is unreachable from the job container network.
Reviewed by Cursor Bugbot for commit dde12e6. Configure here.
There was a problem hiding this comment.
I don't know where this came from 🤔
| SENTRY_PYTHON_TEST_POSTGRES_USER: postgres | ||
| SENTRY_PYTHON_TEST_POSTGRES_PASSWORD: sentry | ||
| SENTRY_PYTHON_TEST_MYSQL_USER: root | ||
| SENTRY_PYTHON_TEST_MYSQL_PASSWORD: sentry |
There was a problem hiding this comment.
Missing MySQL host container env
Medium Severity
The new MySQL CI env sets SENTRY_PYTHON_TEST_MYSQL_USER and password but not SENTRY_PYTHON_TEST_MYSQL_HOST. For Python 3.6/3.7 jobs that run inside a service-linked container, tests/integrations/aiomysql defaults to localhost, unlike Postgres and Redis which use the mysql service hostname in that layout.
Reviewed by Cursor Bugbot for commit e5eb0b3. Configure here.
…ython into py-2352-migrate-quart
sentrivana
left a comment
There was a problem hiding this comment.
Two small things, please see comments, otherwise LGTM
| segment.set_attribute( | ||
| "client.address", request_websocket.access_route[0] | ||
| ) | ||
| segment.set_attribute( | ||
| "user.ip_address", request_websocket.access_route[0] | ||
| ) |
There was a problem hiding this comment.
These should be set in user_properties instead, like ip_address is -- if they're set on the scope via set_user, they'll be set on all spans (including the segment) automatically
There was a problem hiding this comment.
The client.address didn't appear on the list of common attribute keys which is why I didn't add it (not sure if this is potentially a mistake?) but at the very least I can clean up lines 218-220 since it's being added on the scope.
| current_scope = sentry_sdk.get_current_scope() | ||
| existing_user_properties = current_scope._user or {} | ||
| current_scope.set_user( | ||
| {**existing_user_properties, **user_properties} | ||
| ) |
There was a problem hiding this comment.
If we want to merge like this, this should interact with the isolation scope. The top-level set_user API sets the user on the isolation scope, so if there is any user data set by the user, it'll be on the isolation scope.
| current_scope = sentry_sdk.get_current_scope() | |
| existing_user_properties = current_scope._user or {} | |
| current_scope.set_user( | |
| {**existing_user_properties, **user_properties} | |
| ) | |
| isolation_scope = sentry_sdk.get_isolation_scope() | |
| existing_user_properties = isolation_scope._user or {} | |
| isolation_scope.set_user( | |
| {**existing_user_properties, **user_properties} | |
| ) |
There was a problem hiding this comment.
Sounds good! I realized looking at this again that there's a reference to the isolation scope above so I'll use that here.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
There are 3 total unresolved issues (including 2 from previous reviews).
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 6411bda. Configure here.
| try: | ||
| return quart_auth.current_user._auth_id | ||
| except Exception: | ||
| return None |
There was a problem hiding this comment.
Quart auth access unguarded
Medium Severity
Replacing _add_user_to_event with _get_current_user_id_from_quart drops the prior capture_internal_exceptions guard around reading quart_auth.current_user. In the span-streaming request_started path that helper runs outside any internal-exception handler, so a misconfigured or broken Quart Auth accessor can abort request startup instead of being ignored like before.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 6411bda. Configure here.
…ry#6502) Add span streaming support for the Quart integration when the trace_lifecycle stream experiment is enabled. Sets HTTP request attributes (method, headers, URL, query, client IP) on the segment span and uses the correct source constant from sentry_sdk.traces for span-first mode. Depends on getsentry#6501 being merged first. Fixes PY-2352 Fixes getsentry#6050


Add span streaming support for the Quart integration when the
trace_lifecycle stream experiment is enabled. Sets HTTP request
attributes (method, headers, URL, query, client IP) on the segment
span and uses the correct source constant from sentry_sdk.traces
for span-first mode.
Depends on #6501
being merged first.
Fixes PY-2352
Fixes #6050